package com.yuw.hw20190417.test03_2;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import org.junit.jupiter.api.Test;

public class TestDriver {

	@Test
	public void test01() {
		System.out.println("请输入一个目录：");
		Scanner sc = new Scanner(System.in);
		String strPath = sc.nextLine();
		System.out.println("请输入查找的关键字：");
		String strkeyWord = sc.nextLine();
		// 调用子方法遍历该目录
		pintMe(strPath, strkeyWord.trim());
	}

	/**
	 * 非递归遍历目录中的所有文件
	 * 
	 * @param strPath
	 */
	private void pintMe(String strPath, String strkeyWord) {
		// 非递归，文件放入一个遍历的List中（或者栈中）
		List<File> lstFiles = new ArrayList<>();
		// 创建文件对象
		File file = new File(strPath);

		// 判断文件是否存在
		if (file.exists()) {
			// 将文件放入遍历链表中
			lstFiles.add(file);
			// 当文件遍历的链表不为空时，循环遍历所有的文件信息
			while (lstFiles != null && lstFiles.size() > 0) {
				// 取出第一个文件
				File subFile = lstFiles.remove(0);
				// 判断是否为目录
				if (subFile.isDirectory()) {
					// 打印
					System.out.println("目录：" + subFile.getAbsolutePath());
					// 获取目录中的所有的子文件
					File[] subFiles = subFile.listFiles(new FileFilter() {
						
						@Override
						public boolean accept(File f) {
							// 如果返回true，则该文件包含在listFiles方法的结果集中，否则，不包含
							if(f.isDirectory() || f.isFile() && f.getName().contains(strkeyWord)) {
								// 子目录和包含关键字的文件放入结果中
								return true;
							}
							return false;
						}
					});
					// 如果是目录，将所有的子文件放入遍历链表中
					Collections.addAll(lstFiles, subFiles);
				} else {
					// 文件 直接打印:输出包含关键字的文件信息
					//if (subFile.getName().contains(strkeyWord)) {
						System.out.println("文件：" + subFile.getAbsolutePath());
					//}
				}
			}
		}

	}
}
